/**
 * 数值计算
 * 替换js数学计算中产生的错误，比如：0.09999999 + 0.00000001
 */
class MathFn {

    /**
     * @desc 加法
     * @param arg1
     * @param arg2
     * @returns {number} 和
     */
    static add(arg1, arg2) {
        let s1 = arg1.toString();
        let s2 = arg2.toString();
        let arg1Arr = s1.split(".");
        let arg2Arr = s2.split(".");
        let d1 = arg1Arr.length === 2 ? arg1Arr[1] : "";
        let d2 = arg2Arr.length === 2 ? arg2Arr[1] : "";
        let maxLen = Math.max(d1.length, d2.length);
        let m = Math.pow(10, maxLen);
        return Number(((s1 * m + s2 * m) / m).toFixed(maxLen));
    }

    /**
     * @desc 减法
     * @param arg1
     * @param arg2
     * @returns {number} 差
     */
    static sub(arg1, arg2) {
        return this.add(arg1, -arg2);
    }

    /**
     * @desc 乘法
     * @param arg1
     * @param arg2
     * @returns {number} 积
     */
    static mul(arg1, arg2) {
        let m = 0;
        let s1 = arg1.toString();
        let s2 = arg2.toString();
        try {
            m += s1.split(".")[1].length
        } catch (e) {
        }
        try {
            m += s2.split(".")[1].length
        } catch (e) {
        }
        return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
    }

    /**
     * @desc 除法
     * @param arg1
     * @param arg2
     * @returns {number} 商
     */
    static div(arg1, arg2) {
        let t1 = 0;
        let t2 = 0;
        try {
            t1 = arg1.toString().split(".")[1].length
        } catch (e) {
        }
        try {
            t2 = arg2.toString().split(".")[1].length
        } catch (e) {
        }
        let r1 = Number(arg1.toString().replace(".", ""));
        let r2 = Number(arg2.toString().replace(".", ""));
        return this.mul((r1 / r2), Math.pow(10, t2 - t1));
    }

    /**
     * @desc 生成指定范围[min, max]的随机数
     * @param min 最小值
     * @param max 最大值
     * @returns {number} 随机数
     */
    static random(min, max) {
        if (arguments.length === 2) {
            return Math.floor(min + Math.random() * ((max + 1) - min))
        } else {
            return 0;
        }

    }

    /**
     * @desc 随机生成颜色
     * @returns {string} 随机颜色值
     */
    static randomColor() {
        return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6);
    }

}

module.exports = MathFn;